//数青蛙
class Solution {
public:
    int minNumberOfFrogs(string croakOfFrogs) 
    {
        //因为croakOfFrogs中字母的出现次序 是严格按照 croak的顺序的
        //只是可能并发
        //所以某个字符(r)出现 必须知道 当前字符的前一个字符(c) 是不是出现
        //如果不出现 则直接返回-1
        //对于c 他必须出现一次++一次
        //但是本题要求的是最少的青蛙数 如果当前已经有青蛙完成了蛙鸣
        //他就可以再次从c出发 进行蛙鸣
        //如果采用哈希表 哈希表中存放之前出现过的字符
        //就可以知道是不是按顺序出现的
        string word="croak";
        int n=word.size();
        vector<int>hash(n,0);
        //int hash[n]={0};
        unordered_map<char,int>index;//我们需要知道字符的前一个 和后一个
        //采用哈希表存放 -> 当前字符,字符的下标 可以快速找到上下字符是什么
        for(int i=0;i<n;i++)
        {
            index[word[i]]=i;//word的第一个字符 下标是0 ...
        }
        for(auto ch:croakOfFrogs)
        {
            if(ch=='c')
            {
                if(hash[n-1]!=0 ) hash[n-1]--;
                hash[0]++;
            }
            else
            {
                int i=index[ch];
                if(hash[i-1]==0) return -1;
                hash[i-1]--;
                hash[i]++;
            }
        }
        for(int i=0;i<n-1;i++)
        {
            if(hash[i]!=0) return -1;
        }
        return hash[n-1];
    }
};
//外观数列
class Solution {
public:
    string countAndSay(int n) 
    {
        string res="1";
        while(--n)
        {
            func(res);
        }
        return res;
    }
    void func(string &str)
    {
        int l=0,r=0;
        string tmp;
        for(l=0,r=0;r<=str.size();r++)
        {
            if(r==str.size() || str[l]!=str[r] )
            {
                int count=r-l;
                tmp+=to_string(count);
                tmp+=str[l];
                l=r;
            }
        }
        str=tmp;
    }
};
//消失的两个数字
class Solution {
public:
    vector<int> missingTwo(vector<int>& nums) 
    {
        int x=0;
        for(auto e:nums) x^=e;
        for(int i=1;i<=nums.size()+2;i++) x^=i;
        //x 现在就是缺失的那两个数字的^
        //找到最低位那个不是零的1 利用这个将整个数据分成两组
        int y=x&(-x);
        int a=0,b=0;
        for(auto e: nums)
        {
            if(e&y) a^=e;
            else b^=e;
        }
        for(int i=1;i<=nums.size()+2;i++)
        {
            if(i&y) a^=i;
            else b^=i;
        }
        return {a,b};
    }
};